package kr.co.bettersoft.usedmarketandroid.activity;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import kr.co.bettersoft.usedmarketandroid.adapter.UsedMarketChatRoomAdapter;
import kr.co.bettersoft.usedmarketandroid.common.CommonConstant;
import kr.co.bettersoft.usedmarketandroid.common.CommonUtil;
import kr.co.bettersoft.usedmarketandroid.common.PullToRefreshListView;
import kr.co.bettersoft.usedmarketandroid.common.PullToRefreshListView.OnRefreshListener;
import kr.co.bettersoft.usedmarketandroid.common.SwipeListViewActivity;
import kr.co.bettersoft.usedmarketandroid.common.UsedMarketChatRest;
import kr.co.bettersoft.usedmarketandroid.common.UsedMarketRest;
import kr.co.bettersoft.usedmarketandroid.domain.UsedMarketChat;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.Toast;

/**
 * Chat Room List
 *  웹화면 '내상점' 에서 '채팅관리' 버튼 터치시 출력되는 화면.
 *  사용자들이 생성한 채팅방 목록
 *  
 *  목록 좌측에는 등록자의 프로필 사진이 출력
 *  제목 : 물품 판매자가 등록한 물품 판매글 제목
 *  채팅방 생성자 닉네임 / 채팅방 생성일 / 최근 메시지 / 등록된 메시지 개수
 *  좌측 상단 'New' / 우측 상단 '새메시지'
 *  채팅방 터치시 상세 페이지로 이동
 *   
 *  타이틀의 '뒤로' 버튼으로 닫기
 *   
 * @author blue
 *
 */
public class UsedMarketChatRoomListActivity extends SwipeListViewActivity{			
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 변수

	String TAG = "UsedMarketChatRoomListActivity";

	public final int SELECT_CHAT_LIST = 101;  				// 채팅방 목록을 가져온다.		
	public final int UPDATE_DEACTIVATE_CHAT = 102;  		// 채팅방을 비활성화 한다 : 채팅방 목록에서 채팅방 삭제하기		


	SharedPreferences sharedPrefCustom;	// 공용 프립스	
	String phoneNum;						// 사용자 아이디


	// 프래그먼트 종료 여부. 종료된 경우 스레드 호출로 인한 에러를 방지하기 위함
	Boolean isFinished = false;

	CommonUtil commonUtil = new CommonUtil();

	// 서버 통신용
	static Boolean countOne = true;		// 한번에 한번만 통신 하도록
	//	UsedMarketChatRest usedMarketChatRest;
	//	String callResult = "";
	//	JSONObject jsonObject;
	//
	//	String resultStr;		// 요청 결과

	// 서버에서 받은 리스트 임시 저장
	int max = 0;

	// 채팅방 리스트.
	ArrayList<UsedMarketChat> usedMarketChatRoomEntriesFn;
	
	// 삭제 포지션
	public int deletePosition;
	boolean needScroll = false;
	// adapter
	private UsedMarketChatRoomAdapter usedMarketChatRoomAdapter;		// 그리드뷰 사용할 아답터		

	// 화면 구성
	ListView chatRoomListView;
	View emptyView;				// 데이터 없음 뷰
	ProgressBar pb1;		// 중단 로딩 진행바

	Button backBtn;		// 뒤로 가기 버튼

	// pull down refresh
	Boolean pullDownRefreshIng  = false;
	
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			Bundle b = msg.getData();
			try{
				if(b.getInt("showToast")==1){		// 화면에 토스트 띄우기
					Toast.makeText(returnThis(), b.getString("msg"), Toast.LENGTH_SHORT).show();
				}
				if(b.getInt("showAlert")==1){					 // 경고창 . 
					//
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant. alertTitle )                                        
					.setMessage(b.getString("msg"))
					//					.setIcon(R.drawable.ic_dialog_img)		
					.setIcon(R.drawable.ic_launcher)		
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							// 단순 확인 용도
						}})
						.setNegativeButton("", null).show();
				}
				if(b.getInt("showChatRoomList")==1){
					// 데이터를 화면에.. 		
					if((usedMarketChatRoomEntriesFn!=null)&&(usedMarketChatRoomEntriesFn.size()>0)){
						
						setGriding();			// 항시 업뎃
						chatRoomListView.setVisibility(View.VISIBLE);
						emptyView.setVisibility(View.GONE);
					}else{
						Log.d(TAG,"no data");
						chatRoomListView.setEmptyView(emptyView);
						chatRoomListView.setVisibility(View.GONE);
						emptyView.setVisibility(View.VISIBLE);
					}
				}
				
				// 확인받고 삭제.
				if(b.getInt("confirmAndDelete")==1){					 
					// 뷰를 보여주도록 하고, 버튼 클릭시 호출 되도록 하기.
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant. alertTitle )                                        
					.setMessage("해당 방을 목록에서 삭제하시겠습니까?")	// 확인 질문
					.setIcon(R.drawable.ic_launcher)		
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							handler.sendEmptyMessage(UPDATE_DEACTIVATE_CHAT);	// 삭제 - 컨트롤러에서 처리
						}})
						.setNegativeButton(android.R.string.no, null)
						.show();
				}
				
				if(b.getInt("order")==1){
					// 프로그래스바 실행
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 프로그래스바  종료
					pb1.setVisibility(View.GONE);
				}

				switch (msg.what)
				{
				case SELECT_CHAT_LIST : 			// 채팅방 목록을 가져온다.		 
					runOnUiThread(new RunnableSelectChatList());	 
					break;
				case UPDATE_DEACTIVATE_CHAT : 			// 채팅방 에서 사용자 삭제
					runOnUiThread(new RunnableUpdateDeactivateUser());	 
					break;
				default : 
					break;
				}

			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};

	/**
	 * setGriding
	 * 데이터를 화면에 세팅한다
	 *
	 * @param 
	 * @param 
	 * @return 
	 */
	public void setGriding(){
		usedMarketChatRoomAdapter = new UsedMarketChatRoomAdapter(returnThis(), this, usedMarketChatRoomEntriesFn);
		chatRoomListView.setAdapter(usedMarketChatRoomAdapter);

		//			// 클릭시 채팅방으로
		//			chatRoomListView.setOnItemClickListener(new OnItemClickListener() {
		//				public void onItemClick(AdapterView<?> parent, View v,
		//						int position, long id) {
		//					Intent intent = new Intent(getActivity(), ChatRoomActivity.class);
		//					PushChatChat pushChatChatParam =  usedMarketChatRoomEntriesFn.get(position);
		//					intent.putExtra("idChat", pushChatChatParam.getIdChat());			
		//					intent.putExtra("owner", pushChatChatParam.getOwner());			
		//					intent.putExtra("othersNickName", pushChatChatParam.getNickName());			
		//					startActivity(intent);
		//				}	
		//			});

		if(needScroll){
			needScroll = false;
			//			if(deletePosition>3){
			chatRoomListView.setSelection(deletePosition-1);
			//			}
		}
	}
	//		
	//		


	//	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////////////////////////////////////

	@Override
	public ListView getListView() {
		return chatRoomListView;
	}

	@Override
	public void getSwipeItem(boolean isRight, int position) {

		// ### 
		if(chatRoomListView.getCount()==usedMarketChatRoomEntriesFn.size()){	// 상단에 아무것도 없으므로 그냥 사용
			deletePosition = position;
		}else{
			deletePosition = position -1;		// 상단에 pull down refresh 영역 한칸 차지하고 있으므로 한칸 빼줌.
		}

		// 밀면 우측 숨겨진 버튼이 보이도록 하기.
		if(isRight){		// 오른쪽으로 밀면 숨김
			usedMarketChatRoomEntriesFn.get(deletePosition).setShowCancelBtnYn(false);
		}else{				// 왼쪽으로 밀면 생김
			usedMarketChatRoomEntriesFn.get(deletePosition).setShowCancelBtnYn(true);
		}
		usedMarketChatRoomAdapter.notifyDataSetChanged();		

	}

	@Override
	public void onItemClickListener(ListAdapter adapter, int position) {
		// ### 
		int realChatRoomPosition = 0;
		if(chatRoomListView.getCount()==usedMarketChatRoomEntriesFn.size()){	// 상단에 아무것도 없으므로 그냥 사용
			realChatRoomPosition = position;
		}else{
			realChatRoomPosition = position -1;		// 상단에 pull down refresh 영역 한칸 차지하고 있으므로 한칸 빼줌.
		}

		Intent intent = new Intent(returnThis(), UsedMarketChatRoomActivity.class);
		UsedMarketChat usedMarketChatParam =  usedMarketChatRoomEntriesFn.get(realChatRoomPosition);
		intent.putExtra("usedMarketChatIdUsedMarketChat", usedMarketChatParam.getIdUsedMarketChat());			
		intent.putExtra("usedMarketChatIdUsedMarketProduct", usedMarketChatParam.getIdUsedMarketProduct());			
		intent.putExtra("usedMarketChatOwner", usedMarketChatParam.getOwner());			
		intent.putExtra("subject", usedMarketChatParam.getSubject());	
//		intent.putExtra("othersNickName", usedMarketChatParam.getNickName());	
		startActivity(intent);

	}

	@Override
	public void onItemLongClickListener(ListAdapter adapter, int position) {
		// TODO Auto-generated method stub
		
		// ### 
		if(chatRoomListView.getCount()==usedMarketChatRoomEntriesFn.size()){	// 상단에 아무것도 없으므로 그냥 사용
			deletePosition = position;
		}else{
			deletePosition = position -1;		// 상단에 pull down refresh 영역 한칸 차지하고 있으므로 한칸 빼줌.
		}

		// 밀면 우측 숨겨진 버튼이 보이도록 하기.
//		if(isRight){		// 오른쪽으로 밀면 숨김
//			usedMarketChatRoomEntriesFn.get(deletePosition).setShowCancelBtnYn(false);
//		}else{				// 왼쪽으로 밀면 생김
			usedMarketChatRoomEntriesFn.get(deletePosition).setShowCancelBtnYn(true);
//		}
		usedMarketChatRoomAdapter.notifyDataSetChanged();		

	}

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	//	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//		
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		//	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		requestWindowFeature( Window.FEATURE_NO_TITLE );
		setContentView(R.layout.usedmarket_chat_room_list_activity);

		//			usedMarketChatRest = new UsedMarketChatRest();

		chatRoomListView = (ListView) findViewById(R.id.chat_room_list_view);		
		emptyView = findViewById(R.id.empty1);		// 데이터 없으면 '빈 페이지'(데이터 없음 메시지)표시
		pb1=(ProgressBar) findViewById(R.id.progressbar);

		// 뒤로 버튼으로 종료
		backBtn = (Button) findViewById(R.id.backBtn);		
		backBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				finish();
			}
		});

		// prefs
		sharedPrefCustom = getSharedPreferences(CommonConstant.prefName,
				Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);

		// 전번 세팅 // 사용자 아이디를 꺼낸다.
		phoneNum = sharedPrefCustom.getString("phoneNum", "");



		////////////////////////////////pull down list
		// Set a listener to be invoked when the list should be refreshed.
		((PullToRefreshListView) chatRoomListView).setOnRefreshListener(new OnRefreshListener() {
			@Override
			public void onRefresh() {
				// Do work to refresh the list here.
				if(countOne){
					countOne = false;		
					try {
						pullDownRefreshIng = true;				// 기본 로딩바는 보여주지 않기 위함
						new GetDataTask().execute();
					}catch (Exception e) {
						e.printStackTrace();
					} 
				}else{
					Log.d(TAG,"already running..");		 
					((PullToRefreshListView) chatRoomListView).onRefreshComplete();
				}

			}
		});

	}
	//

	//	//////////////////////////////////////////////////////////////////////////////////////////////////////
	// pull down list

	private class GetDataTask extends AsyncTask<Void, Void, String[]> {
		@Override
		protected String[] doInBackground(Void... params) {
			// Simulates a background job.
			Log.d(TAG,"GetDataTask");

			// 파라미터 세팅
			UsedMarketChat usedMarketChat = new UsedMarketChat(); 
			usedMarketChat.setPhoneNumber(phoneNum);

			UsedMarketChatRest usedMarketChatRest = new UsedMarketChatRest();

			// 서버 메소드 호출
			if(!isFinished){
				String callResult = usedMarketChatRest.RestSelectChatList(usedMarketChat);	

				// 결과 처리
				if(!(callResult.equals("F")) && callResult.length()>0){
					try {
						JSONArray jsonArray = new JSONArray(callResult);
						int max = jsonArray.length();

						usedMarketChatRoomEntriesFn = new ArrayList<UsedMarketChat>(max);

						CommonUtil commonUtil = new CommonUtil();

						Date tempDate = new Date();

						String tmp_idUsedMarketChat = "";						// 채팅 테이블 아이디.
						String tmp_idUsedMarketProduct = "";					// 물품 테이블 아이디.
						String tmp_owner = "";									// 채팅방 생성자 휴대전화번호.
						String tmp_activateYn = "";								// 활성화 여부.
						String tmp_modifyDate = "";								// 수정 일자.
						String tmp_registerDate = "";							// 등록 일자.
						String tmp_phoneNumber = "";							// 휴대전화번호.
						String tmp_idUsedMarketChatUser = "";					// 채팅방을 개설하면서 같이 추가 할 사용자 도메인 정보들.
						String tmp_usedMarketChatIdUsedMarketChat = "";			// 채팅방을 개설하면서 같이 추가 할 사용자 도메인 정보들.
						String tmp_usedMarketChatIdUsedMarketProduct = "";		// 채팅방을 개설하면서 같이 추가 할 사용자 도메인 정보들.
						String tmp_recognitionCount = "";						// 인식한 메시지 숫자.? 0이면 새로운 방. 왼쪽에"New"
						String tmp_readYn = "";									// 읽음 여부. N이면 오른쪽에"새메시지"
						String tmp_otherUserNickName = "";						// 상대 닉넴
						String tmp_otherUserPhoneNumber = "";					// 상대 전번
						String tmp_thumbnailSmall = "";							// 상대 썸네일이미지
						String tmp_messageCount = "";							// 등록된 메시지 갯수.
						String tmp_content = "";								// 마지막 대화 내용.
						String tmp_subject = "";								// 물품 등록 제목.
//						String tmp_thumbnailUrl = "";
//						String tmp_otherUserId = "";
//						Bitmap tmp_profileImage = null;
						Bitmap tmp_thumbnail = null;
						
						if(max>0){
							for ( int i = 0; i < max; i++ ){
								JSONObject jsonObj = jsonArray.getJSONObject(i);
								
								tmp_idUsedMarketChat = checkNull(jsonObj.getString("idUsedMarketChat"));
								tmp_idUsedMarketProduct = checkNull(jsonObj.getString("idUsedMarketProduct"));
								tmp_owner = checkNull(jsonObj.getString("owner"));
								tmp_activateYn = checkNull(jsonObj.getString("activateYn"));
								tmp_modifyDate = checkNull(jsonObj.getString("modifyDate"));
								
								try{
									// 형변환하여 넣기 날짜.
									tmp_registerDate = checkNull(jsonObj.getString("registerDate"));
									tempDate = commonUtil.sf.parse(tmp_registerDate);
									SimpleDateFormat sfGeneral = commonUtil.sfGeneral;
//									SimpleDateFormat sfGeneral = new SimpleDateFormat("yyyy"+year+" MM"+month+" dd"+day+" a hh"+hour+" mm"+minute);
//									SimpleDateFormat sfGeneral2 = new SimpleDateFormat("yyyy"+year+" MM"+month+" dd"+day+" HH"+hour+" mm"+minute);
//									SimpleDateFormat sfGeneralChat = new SimpleDateFormat("MM"+month+" dd"+day+" a hh"+hour+" mm"+minute);
									tmp_registerDate = sfGeneral.format(tempDate);
								}catch(Exception e){
									tmp_registerDate = "";
									e.printStackTrace();
								}
								
								tmp_phoneNumber = checkNull(jsonObj.getString("phoneNumber"));
								tmp_idUsedMarketChatUser = checkNull(jsonObj.getString("idUsedMarketChatUser"));
								tmp_usedMarketChatIdUsedMarketChat = checkNull(jsonObj.getString("usedMarketChatIdUsedMarketChat"));
								tmp_usedMarketChatIdUsedMarketProduct = checkNull(jsonObj.getString("usedMarketChatIdUsedMarketProduct"));
								tmp_recognitionCount = checkNull(jsonObj.getString("recognitionCount"));
								tmp_readYn = checkNull(jsonObj.getString("readYn"));
								tmp_otherUserNickName = checkNull(jsonObj.getString("otherUserNickName"));
								tmp_otherUserPhoneNumber = checkNull(jsonObj.getString("otherUserPhoneNumber"));
								tmp_messageCount = checkNull(jsonObj.getString("messageCount"));
								tmp_content = checkNull(jsonObj.getString("content"));
								tmp_subject = checkNull(jsonObj.getString("subject"));
								
								// 이미지 로드하여 넣기.
								try{
									tmp_thumbnailSmall = checkNull(jsonObj.getString("thumbnailSmall"));
									if(tmp_thumbnailSmall.length()<1){
										tmp_thumbnail = null;
									}else{
										tmp_thumbnail = LoadImage(tmp_thumbnailSmall);
										tmp_thumbnail = commonUtil.getRoundedCornerBitmap(tmp_thumbnail);	// 라운딩 처리
									}
								}catch(Exception e){
									tmp_thumbnailSmall = "";
									tmp_thumbnail = null;
								}
								
								usedMarketChatRoomEntriesFn.add(new UsedMarketChat(
										tmp_idUsedMarketChat,
										tmp_idUsedMarketProduct,
										tmp_owner,
										tmp_activateYn,
										tmp_modifyDate,
										tmp_registerDate,
										tmp_phoneNumber,
										tmp_idUsedMarketChatUser,
										tmp_usedMarketChatIdUsedMarketChat,
										tmp_usedMarketChatIdUsedMarketProduct,
										tmp_recognitionCount,
										tmp_readYn,
										tmp_otherUserNickName,
										tmp_otherUserPhoneNumber,
										tmp_thumbnailSmall,
										tmp_thumbnail,
										tmp_messageCount,
										tmp_content,
										tmp_subject
//										String tmp_messageCount = "";
//										String tmp_content = "";
//										String tmp_thumbnailUrl = "";
//										String tmp_otherUserId = "";
//										Bitmap tmp_profileImage = null;
								));
							}
						}
					}catch (JSONException e) {
						e.printStackTrace();
					}
					//							pushChatChatEntriesFn = pushChatChatEntries; 

					Log.d(TAG,"usedMarketChatRoomEntriesFn size:"+usedMarketChatRoomEntriesFn.size());

					// 이미지 없을때 기본 이미지
					for(int i=0; i<usedMarketChatRoomEntriesFn.size(); i++){
						if(usedMarketChatRoomEntriesFn.get(i).getThumbnail() == null){
							BitmapDrawable default_bd = (BitmapDrawable) getResources().getDrawable((R.drawable.empty_member));
							Bitmap default_bmp = default_bd.getBitmap();
							default_bmp = commonUtil.getRoundedCornerBitmap(default_bmp);	// 라운딩 처리
							usedMarketChatRoomEntriesFn.get(i).setThumbnail(default_bmp);
						}
					}
				}
				// 화면에 보여주기
				showChatRoomList();
			}
			countOne = true;		// 다시 호출 되도록 수정..
			return null;
		}
		@Override
		protected void onPostExecute(String[] result) {
			// Call onRefreshComplete when the list has been refreshed.
			pullDownRefreshIng = false;							// 기본 로딩바 보여주기 상태 초기화. resume 기능으로는 보여지도록.
			((PullToRefreshListView) chatRoomListView).onRefreshComplete();		// 리프레시가 끝났음을....
			super.onPostExecute(result);
		}
	}

	/**
	 * 채팅방 리스트를 보여준다
	 * showChatRoomList
	 */
	public void showChatRoomList(){
		runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showChatRoomList", 1);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


	/**
	 * confirmAndDelete
	 *  확인 후 삭제
	 *
	 * @param msg
	 * @param
	 * @return 
	 */
	public void confirmAndDelete(){
		runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("confirmAndDelete", 1);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


	/**
	 * 러너블. 채팅방 목록을 가져온다.		
	 */
	class RunnableSelectChatList implements Runnable {
		public void run(){
			new backgroundThreadSelectChatList().execute();
		}
	}
	/**
	 * backgroundThreadSelectChatList
	 * 비동기 스레드  채팅방 목록을 가져온다.
	 * @author blue
	 *
	 */
	public class backgroundThreadSelectChatList extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadSelectChatList");

			// 파라미터 세팅
			UsedMarketChat usedMarketChat = new UsedMarketChat(); 
			usedMarketChat.setPhoneNumber(phoneNum);

			UsedMarketChatRest usedMarketChatRest = new UsedMarketChatRest();

			// 서버 메소드 호출
			if(!isFinished){
				String callResult = usedMarketChatRest.RestSelectChatList(usedMarketChat);	


				// 결과 처리
				if(!(callResult.equals("F")) && callResult.length()>0){
					try {
						JSONArray jsonArray = new JSONArray(callResult);
						int max = jsonArray.length();

						usedMarketChatRoomEntriesFn = new ArrayList<UsedMarketChat>(max);

						CommonUtil commonUtil = new CommonUtil();

						Date tempDate = new Date();

						String tmp_idUsedMarketChat = "";						// 채팅 테이블 아이디.
						String tmp_idUsedMarketProduct = "";					// 물품 테이블 아이디.
						String tmp_owner = "";									// 채팅방 생성자 휴대전화번호.
						String tmp_activateYn = "";								// 활성화 여부.
						String tmp_modifyDate = "";								// 수정 일자.
						String tmp_registerDate = "";							// 등록 일자.
						String tmp_phoneNumber = "";							// 휴대전화번호.
						String tmp_idUsedMarketChatUser = "";					// 채팅방을 개설하면서 같이 추가 할 사용자 도메인 정보들.
						String tmp_usedMarketChatIdUsedMarketChat = "";			// 채팅방을 개설하면서 같이 추가 할 사용자 도메인 정보들.
						String tmp_usedMarketChatIdUsedMarketProduct = "";		// 채팅방을 개설하면서 같이 추가 할 사용자 도메인 정보들.
						String tmp_recognitionCount = "";						// 인식한 메시지 숫자.? 0이면 새로운 방. 왼쪽에"New"
						String tmp_readYn = "";									// 읽음 여부. N이면 오른쪽에"새메시지"
						String tmp_otherUserNickName = "";						// 상대 닉넴
						String tmp_otherUserPhoneNumber = "";					// 상대 전번
						String tmp_thumbnailSmall = "";							// 상대 썸네일이미지
						String tmp_messageCount = "";							// 등록된 메시지 갯수.
						String tmp_content = "";								// 마지막 대화 내용.
						String tmp_subject = "";								// 물품 등록 제목.
//						String tmp_thumbnailUrl = "";
//						String tmp_otherUserId = "";
//						Bitmap tmp_profileImage = null;
						Bitmap tmp_thumbnail = null;
						
						if(max>0){
							for ( int i = 0; i < max; i++ ){
								JSONObject jsonObj = jsonArray.getJSONObject(i);
								
								tmp_idUsedMarketChat = checkNull(jsonObj.getString("idUsedMarketChat"));
								tmp_idUsedMarketProduct = checkNull(jsonObj.getString("idUsedMarketProduct"));
								tmp_owner = checkNull(jsonObj.getString("owner"));
								tmp_activateYn = checkNull(jsonObj.getString("activateYn"));
								tmp_modifyDate = checkNull(jsonObj.getString("modifyDate"));
								
								try{
									// 형변환하여 넣기 날짜.
									tmp_registerDate = checkNull(jsonObj.getString("registerDate"));
									tempDate = commonUtil.sf.parse(tmp_registerDate);
									SimpleDateFormat sfGeneral = commonUtil.sfGeneral;
//									SimpleDateFormat sfGeneral = new SimpleDateFormat("yyyy"+year+" MM"+month+" dd"+day+" a hh"+hour+" mm"+minute);
//									SimpleDateFormat sfGeneral2 = new SimpleDateFormat("yyyy"+year+" MM"+month+" dd"+day+" HH"+hour+" mm"+minute);
//									SimpleDateFormat sfGeneralChat = new SimpleDateFormat("MM"+month+" dd"+day+" a hh"+hour+" mm"+minute);
									tmp_registerDate = sfGeneral.format(tempDate);
								}catch(Exception e){
									tmp_registerDate = "";
									e.printStackTrace();
								}
								
								tmp_phoneNumber = checkNull(jsonObj.getString("phoneNumber"));
								tmp_idUsedMarketChatUser = checkNull(jsonObj.getString("idUsedMarketChatUser"));
								tmp_usedMarketChatIdUsedMarketChat = checkNull(jsonObj.getString("usedMarketChatIdUsedMarketChat"));
								tmp_usedMarketChatIdUsedMarketProduct = checkNull(jsonObj.getString("usedMarketChatIdUsedMarketProduct"));
								tmp_recognitionCount = checkNull(jsonObj.getString("recognitionCount"));
								tmp_readYn = checkNull(jsonObj.getString("readYn"));
								tmp_otherUserNickName = checkNull(jsonObj.getString("otherUserNickName"));
								tmp_otherUserPhoneNumber = checkNull(jsonObj.getString("otherUserPhoneNumber"));
								tmp_messageCount = checkNull(jsonObj.getString("messageCount"));
								tmp_content = checkNull(jsonObj.getString("content"));
								tmp_subject = checkNull(jsonObj.getString("subject"));
								
								// 이미지 로드하여 넣기.
								try{
									tmp_thumbnailSmall = checkNull(jsonObj.getString("thumbnailSmall"));
									if(tmp_thumbnailSmall.length()<1){
										tmp_thumbnail = null;
									}else{
										tmp_thumbnail = LoadImage(tmp_thumbnailSmall);
										tmp_thumbnail = commonUtil.getRoundedCornerBitmap(tmp_thumbnail);	// 라운딩 처리
									}
								}catch(Exception e){
									tmp_thumbnailSmall = "";
									tmp_thumbnail = null;
								}
								
								usedMarketChatRoomEntriesFn.add(new UsedMarketChat(
										tmp_idUsedMarketChat,
										tmp_idUsedMarketProduct,
										tmp_owner,
										tmp_activateYn,
										tmp_modifyDate,
										tmp_registerDate,
										tmp_phoneNumber,
										tmp_idUsedMarketChatUser,
										tmp_usedMarketChatIdUsedMarketChat,
										tmp_usedMarketChatIdUsedMarketProduct,
										tmp_recognitionCount,
										tmp_readYn,
										tmp_otherUserNickName,
										tmp_otherUserPhoneNumber,
										tmp_thumbnailSmall,
										tmp_thumbnail,
										tmp_messageCount,
										tmp_content,
										tmp_subject
//										String tmp_messageCount = "";
//										String tmp_content = "";
//										String tmp_thumbnailUrl = "";
//										String tmp_otherUserId = "";
//										Bitmap tmp_profileImage = null;
								));
							}
						}
					}catch (JSONException e) {
						e.printStackTrace();
					}
					//							pushChatChatEntriesFn = pushChatChatEntries; 

					Log.d(TAG,"usedMarketChatRoomEntriesFn size:"+usedMarketChatRoomEntriesFn.size());

					// 이미지 없을때 기본 이미지
					for(int i=0; i<usedMarketChatRoomEntriesFn.size(); i++){
						if(usedMarketChatRoomEntriesFn.get(i).getThumbnail() == null){
							BitmapDrawable default_bd = (BitmapDrawable) getResources().getDrawable((R.drawable.empty_member));
							Bitmap default_bmp = default_bd.getBitmap();
							default_bmp = commonUtil.getRoundedCornerBitmap(default_bmp);	// 라운딩 처리
							usedMarketChatRoomEntriesFn.get(i).setThumbnail(default_bmp);
						}
					}
				}
				// 화면에 보여주기
				showChatRoomList();
			}
			countOne = true;		// 다시 호출 되도록 수정..
			return null; 
		}
	}
	
	/**
	 * 러너블. 채팅방 에서 사용자 삭제	
	 */
	class RunnableUpdateDeactivateUser implements Runnable {
		public void run(){
			new backgroundThreadUpdateDeactivateUser().execute();
		}
	}
	/**
	 * backgroundThreadUpdateDeactivateUser
	 * 비동기 스레드  채팅방 에서 사용자 삭제	
	 * @author blue
	 *
	 */
	public class backgroundThreadUpdateDeactivateUser extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadUpdateDeactivateUser");

			
			// 파라미터 세팅
			UsedMarketChat usedMarketChat = new UsedMarketChat(); 
			
			usedMarketChat.setIdUsedMarketChat(usedMarketChatRoomEntriesFn.get(deletePosition).getIdUsedMarketChat());			// 채팅방 테이블 아이디.
			usedMarketChat.setIdUsedMarketProduct(usedMarketChatRoomEntriesFn.get(deletePosition).getIdUsedMarketProduct());		// 물품 테이블 아이디.
			usedMarketChat.setOwner(usedMarketChatRoomEntriesFn.get(deletePosition).getOwner());						// 생성자 휴대전화번호.
			usedMarketChat.setPhoneNumber(phoneNum);

			UsedMarketChatRest usedMarketChatRest = new UsedMarketChatRest();

			showPb();
			if(!isFinished){
				
				String callResult = usedMarketChatRest.RestUpdateDeactivateChat(usedMarketChat);	
				
				// 결과 처리
				if(callResult.equals("SUCCESS")){
					// 알림창 띄우고 리스트 새로 고침
					needScroll = true;
					handler.sendEmptyMessage(SELECT_CHAT_LIST);		// 전체 목록 불러오기 
					showResultDialog("삭제 성공하였습니다.");
				}else{
					// 알림창 띄움
					showResultDialog("삭제 실패하였습니다.");
				}
				
			}
			hidePb();		// @@ 
			
			countOne = true;		// 다시 호출 되도록 수정..	
			
			return null; 
		}
	}


	//	///////////////////////////////////////////////////////////////////////////////////////////////////////

	// 이미지 처리
	/**
	 * LoadImage
	 *  이미지 URL 에서 이미지 받아온 스트림을 비트맵으로 저장한다
	 *
	 * @param $imagePath
	 * @param
	 * @return bm
	 */
	private Bitmap LoadImage( String $imagePath ) {
		InputStream inputStream = OpenHttpConnection( $imagePath ) ;
		Bitmap bm = BitmapFactory.decodeStream( inputStream ) ;
		return bm;
	}
	/**
	 * OpenHttpConnection
	 *  이미지 URL 에서 이미지 받아와서 스트림으로 저장한다
	 *
	 * @param $imagePath
	 * @param
	 * @return stream
	 */
	private InputStream OpenHttpConnection(String $imagePath) {
		// TODO Auto-generated method stub
		InputStream stream = null ;
		try {
			URL url = new URL( $imagePath ) ;
			HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection() ;
			urlConnection.setRequestMethod( "GET" ) ;
			urlConnection.connect() ;
			if( urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK ) {
				stream = urlConnection.getInputStream() ;
			}
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			Log.d(TAG,"OpenHttpConnection-"+$imagePath);
			Log.w(TAG,"MalformedURLException");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			Log.w(TAG,"IOException");
		}
		return stream ;
	}




	////////////////////////	Util	///////////////////////////////////////////////////////////////////////	

	/**
	 * null 체크하여 처리
	 */
	public String checkNull(String str){
		if(str==null || str.equals("null")){
			return "";
		}
		return str;
	}
	
	
	/**
	 * returnThis
	 *  컨택스트 리턴한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public Context returnThis(){
		return this;
	}

	/*
	 * 핸들러를 통한 작업.
	 */
	/**
	 * showMsg
	 *  화면에 토스트 띄움 msg 변수에 내용을 넣어서 호출하면 화면에 토스트를 띄운다.
	 *
	 * @param msg
	 * @param
	 * @return
	 */
	public void showMsg(final String msg){		
		runOnUiThread(new Runnable(){	 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showToast", 1);
				b.putString("msg", msg);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	} 

	/**
	 * showResultDialog
	 *  얼럿 띄운다
	 *
	 * @param msg
	 * @param
	 * @return 
	 */
	public void showResultDialog(final String msg){
		runOnUiThread(new Runnable(){	 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showAlert", 1);
				b.putString("msg", msg);			// 화면에 보여줄 메시지
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}
	// 확인을 받는 컨펌 창을 띄운다
	/**
	 * showConfirmDialog
	 *  확인을 받는 컨펌 창을 띄운다
	 *
	 * @param showConfirmCode
	 * @param msg
	 * @return 
	 */
	public void showConfirmDialog(final int showConfirmCode, final String msg){
		runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showConfirm", showConfirmCode);		 
				b.putString("msg", msg);			// 화면에 보여줄 메시지
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}

	// 중앙 프로그래스바 보임, 숨김
	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		new Thread( 
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 1);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 2);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}

	/**
	 * onResume
	 *  액티비티 리쥼시 닫기 카운터초기화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	@Override
	public void onResume(){
		super.onResume();
		isFinished = false;

		if(countOne){
			countOne = false;		
			handler.sendEmptyMessage(SELECT_CHAT_LIST);		// 전체 목록 불러오기 
		}else{
			Log.d(TAG,"already running..");		 
		}
	}
	@Override
	public void onDestroy(){
		isFinished = true;
		super.onDestroy();
	}

}